// 配置路由的地方
import Vue from 'vue';
import VueRouter from 'vue-router';

import routes from './routes'

// 引入store
import store from '@/store'

// 使用插件
Vue.use(VueRouter);
// 先把VueRouter原型对象push，先保存一份
const originalPush = VueRouter.prototype.push;
const originalRepalce = VueRouter.prototype.replace;

// 重写push|replace
// 第一个参数：告诉原来push方法，你往哪里跳转（传递哪些参数）
VueRouter.prototype.push = function (location, resolve, reject) {
    if (resolve && reject) {
        // call | apply区别
        // 相同点，都可以调用函数一次，都可以村该函数的上下文一次
        // 不同点：call与apply传递参数：call传递参数用逗号隔开，apply方法执行，传递数组
        originalPush.call(this, location, resolve, reject);
    } else {
        originalPush.call(this, location, () => { }, () => { })
    }
}
VueRouter.prototype.replace = function (location, resolve, reject) {
    if (resolve && reject) {
        originalRepalce.call(this, location, resolve, reject);
    } else {
        originalRepalce.call(this.location, () => { }, () => { })
    }
}



// 配置路由
let router = new VueRouter({
    // 配置路由
    routes,
    // 滚动行为
    scrollBehavior(to, from, savedPosition) {
        // 返回的这个y=0，代表的滚动条在最上方
        return { y: 0 }
    }
})

// 解决ElementUI导航栏中的vue-router在3.0版本以上重复点菜单报错问题
// const originalPush = VueRouter.prototype.push
// VueRouter.prototype.push = function push(location) {
// return originalPush.call(this, location).catch(err => err)
// }

// 全局首位：前置路由守卫（在路由跳转之前进行判断）
router.beforeEach(async (to, from, next) => {
    // to:可以获取到跳转到那个路由组件
    // from: 从那个路由组件来的信息
    // next: 放行函数 next()放行
    // next('/login')放行到指定路由组件
    // next(false): 中断 
    // next();
    // 用户登录了，才会有token，未登录一定不会又token
    let token = store.state.user.token
    // 用户信息
    let name = store.state.user.userInfo.name;
    // 用户已经登录了
    if (token) {
        // 用户已经登录了还想去login休想
        if (to.path == '/login') {
            next('/home');
        } else {
            // 登录了，但是去的不是login
            if (name) {
                // 已有用户信息
                next();
            } else {
                // 没有用户信息, 
                try {
                    await store.dispatch('getUserInfo');
                    next();
                } catch (error) {
                    // token失效了获取不到用户信息，让用户重新登陆
                    // 清楚token
                    await store.dispatch('userLogout');
                    next('/login');
                }
            }
        }
    } else {
        // 未登录: 不能去交易相关, 不能去支付相关、不能去个人中心
        // 未登录去上面这些路由-----登录页
        let toPath = to.path;
        if (toPath.indexOf('/trader') != -1 || toPath.indexOf('/pay') != -1 || toPath.indexOf('/center') != -1) {
            // 把未登录的时候想去而没去成的信息，存储于地址栏中[路由]
            next('login?redirect=' + toPath);
        } else {
            // 去的不上上面这些路由(home|search|shopCart)----放行
            next();
        }
        
    }
});


export default router;
